package model;

import java.sql.Date;
import java.util.ArrayList;
import java.util.Objects;
import model.persistencia.ClienteDAO;

public class ClienteModel implements ICliente{

    private int codigo;     
    private String nome;       
    private String endereco;
    private String email;      
    private String bairro;
    private String cidade;     
    private String cep;
    private String uf;
    private String fone;       
    private String celular;
    private String cpf;        
    private String obs;        
    private String rg;         
    private String orgaoRg;    
    private Date dataCadastro;
    private Date dataNasc;
    private String cnpj;  
    private String sexo;
    private String profissao;
    private String empresa;    
    private String foneEmpresa;
    private double renda;
    private String referencia;
    private String foneReferencia;
    private String auditoria;     
    private ClienteDAO clienteDAO;
    private ArrayList observers;    
            
//    String INSEST;           
    private static ClienteModel instance = null;

    public synchronized static ClienteModel getInstance(){
        if (instance == null) {
            instance = new ClienteModel();
        }
        return instance;
    }
    
    
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final ClienteModel other = (ClienteModel) obj;
        if (this.codigo != other.codigo) {
            return false;
        }
        if (!Objects.equals(this.nome, other.nome)) {
            return false;
        }
        if (!Objects.equals(this.endereco, other.endereco)) {
            return false;
        }
        if (!Objects.equals(this.email, other.email)) {
            return false;
        }
        if (!Objects.equals(this.bairro, other.bairro)) {
            return false;
        }
        if (!Objects.equals(this.cidade, other.cidade)) {
            return false;
        }
        if (!Objects.equals(this.cep, other.cep)) {
            return false;
        }
        if (!Objects.equals(this.uf, other.uf)) {
            return false;
        }
        if (!Objects.equals(this.fone, other.fone)) {
            return false;
        }
        if (!Objects.equals(this.celular, other.celular)) {
            return false;
        }
        if (!Objects.equals(this.cpf, other.cpf)) {
            return false;
        }
        if (!Objects.equals(this.obs, other.obs)) {
            return false;
        }
        if (!Objects.equals(this.rg, other.rg)) {
            return false;
        }
        if (!Objects.equals(this.orgaoRg, other.orgaoRg)) {
            return false;
        }
        if (!Objects.equals(this.dataCadastro, other.dataCadastro)) {
            return false;
        }
        if (!Objects.equals(this.dataNasc, other.dataNasc)) {
            return false;
        }
        if (!Objects.equals(this.cnpj, other.cnpj)) {
            return false;
        }
        if (!Objects.equals(this.sexo, other.sexo)) {
            return false;
        }
        if (!Objects.equals(this.profissao, other.profissao)) {
            return false;
        }
        if (!Objects.equals(this.empresa, other.empresa)) {
            return false;
        }
        if (!Objects.equals(this.foneEmpresa, other.foneEmpresa)) {
            return false;
        }
        if (Double.doubleToLongBits(this.renda) != Double.doubleToLongBits(other.renda)) {
            return false;
        }
        if (!Objects.equals(this.referencia, other.referencia)) {
            return false;
        }
        if (!Objects.equals(this.foneReferencia, other.foneReferencia)) {
            return false;
        }
        if (!Objects.equals(this.auditoria, other.auditoria)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 37 * hash + this.codigo;
        hash = 37 * hash + Objects.hashCode(this.nome);
        hash = 37 * hash + Objects.hashCode(this.endereco);
        hash = 37 * hash + Objects.hashCode(this.email);
        hash = 37 * hash + Objects.hashCode(this.bairro);
        hash = 37 * hash + Objects.hashCode(this.cidade);
        hash = 37 * hash + Objects.hashCode(this.cep);
        hash = 37 * hash + Objects.hashCode(this.uf);
        hash = 37 * hash + Objects.hashCode(this.fone);
        hash = 37 * hash + Objects.hashCode(this.celular);
        hash = 37 * hash + Objects.hashCode(this.cpf);
        hash = 37 * hash + Objects.hashCode(this.obs);
        hash = 37 * hash + Objects.hashCode(this.rg);
        hash = 37 * hash + Objects.hashCode(this.orgaoRg);
        hash = 37 * hash + Objects.hashCode(this.dataCadastro);
        hash = 37 * hash + Objects.hashCode(this.dataNasc);
        hash = 37 * hash + Objects.hashCode(this.cnpj);
        hash = 37 * hash + Objects.hashCode(this.sexo);
        hash = 37 * hash + Objects.hashCode(this.profissao);
        hash = 37 * hash + Objects.hashCode(this.empresa);
        hash = 37 * hash + Objects.hashCode(this.foneEmpresa);
        hash = 37 * hash + (int) (Double.doubleToLongBits(this.renda) ^ (Double.doubleToLongBits(this.renda) >>> 32));
        hash = 37 * hash + Objects.hashCode(this.referencia);
        hash = 37 * hash + Objects.hashCode(this.foneReferencia);
        hash = 37 * hash + Objects.hashCode(this.auditoria);
        return hash;
    }

    @Override
    public String toString() {
        return "ClienteModel{" + "codigo=" + codigo + ", nome=" + nome + ", endereco=" + endereco + ", email=" + email + ", bairro=" + bairro + ", cidade=" + cidade + ", cep=" + cep + ", uf=" + uf + ", fone=" + fone + ", celular=" + celular + ", cpf=" + cpf + ", obs=" + obs + ", rg=" + rg + ", orgaoRg=" + orgaoRg + ", dataCadastro=" + dataCadastro + ", dataNasc=" + dataNasc + ", cnpj=" + cnpj + ", sexo=" + sexo + ", profissao=" + profissao + ", empresa=" + empresa + ", foneEmpresa=" + foneEmpresa + ", renda=" + renda + ", referencia=" + referencia + ", foneReferencia=" + foneReferencia + ", auditoria=" + auditoria + '}';
    }
    
    
    public ClienteModel() {
        clienteDAO = new ClienteDAO(this);
        observers = new ArrayList();
    }

    public ClienteModel(int codigo, String nome, String endereco, String email, String bairro, String cidade, String cep, 
            String uf, String fone, String celular, String cpf, String obs, String rg, String orgaoRg, Date dataCadastro, 
            String cnpj, String auditoria) {
        this.codigo = codigo;
        this.nome = nome;
        this.endereco = endereco;
        this.email = email;
        this.bairro = bairro;
        this.cidade = cidade;
        this.cep = cep;
        this.uf = uf;
        this.fone = fone;
        this.celular = celular;
        this.cpf = cpf;
        this.obs = obs;
        this.rg = rg;
        this.orgaoRg = orgaoRg;
        this.dataCadastro = dataCadastro;
        this.cnpj = cnpj;
        this.auditoria = auditoria;
    }
    
    @Override
    public void setProximoCodigo(){        
        int proximoCodigo = clienteDAO.getCodigo(SQL_ULTIMO,0) + 1;
        this.codigo = proximoCodigo;
    }
    
    @Override
    public ClienteModel getCliente(int codigo) {
        return clienteDAO.getObject(codigo);
    }
    
    @Override
    public ArrayList getAll() {
        return pesquisar(SQL_GETALL, "0");
    }
   
    //<editor-fold defaultstate="collapsed" desc="GET E SET METODOS">
    @Override
    public int getCodigo() {
        return codigo;
    }
    
    @Override
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }
    
    @Override
    public String getNome() {
        return nome;
    }
    
    @Override
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    @Override
    public String getEndereco() {
        return endereco;
    }
    
    @Override
    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }
    
    @Override
    public String getEmail() {
        return email;
    }
    
    @Override
    public void setEmail(String email) {
        this.email = email;
    }
    
    @Override
    public String getBairro() {
        return bairro;
    }
    
    @Override
    public void setBairro(String bairro) {
        this.bairro = bairro;
    }
    
    @Override
    public String getCidade() {
        return cidade;
    }
    
    @Override
    public void setCidade(String cidade) {
        this.cidade = cidade;
    }
    
    @Override
    public String getCep() {
        return cep;
    }
    
    @Override
    public void setCep(String cep) {
        this.cep = cep;
    }
    
    @Override
    public String getUf() {
        return uf;
    }
    
    @Override
    public void setUf(String uf) {
        this.uf = uf;
    }
    
    @Override
    public String getFone() {
        return fone;
    }
    
    @Override
    public void setFone(String fone) {
        this.fone = fone;
    }
    
    @Override
    public String getCelular() {
        return celular;
    }
    
    @Override
    public void setCelular(String celular) {
        this.celular = celular;
    }
    
    @Override
    public String getCpf() {
        return cpf;
    }
    
    @Override
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }
    
    @Override
    public String getObs() {
        return obs;
    }
    
    @Override
    public void setObs(String obs) {
        this.obs = obs;
    }
    
    @Override
    public String getRg() {
        return rg;
    }
    
    @Override
    public void setRg(String rg) {
        this.rg = rg;
    }
    
    @Override
    public String getOrgaoRg() {
        return orgaoRg;
    }
    
    @Override
    public void setOrgaoRg(String orgaoRg) {
        this.orgaoRg = orgaoRg;
    }
    
    @Override
    public Date getDataCadastro() {
        return dataCadastro;
    }
    
    @Override
    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }
    
    @Override
    public String getCnpj() {
        return cnpj;
    }
    
    @Override
    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }   
    
    @Override
    public Date getDataNasc() {
        return dataNasc;
    }

    @Override
    public void setDataNasc(Date dataNasc) {
        this.dataNasc = dataNasc;
    }

    @Override
    public String getSexo() {
        return sexo;
    }

    @Override
    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    @Override
    public String getProfissao() {
        return profissao;
    }

    @Override
    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }

    @Override
    public String getEmpresa() {
        return empresa;
    }

    @Override
    public void setEmpresa(String empresa) {
        this.empresa = empresa;
    }

    @Override
    public String getFoneEmpresa() {
        return foneEmpresa;
    }

    @Override
    public void setFoneEmpresa(String foneEmpresa) {
        this.foneEmpresa = foneEmpresa;
    }

    @Override
    public double getRenda() {
        return renda;
    }

    @Override
    public void setRenda(double renda) {
        this.renda = renda;
    }

    @Override
    public String getReferencia() {
        return referencia;
    }

    @Override
    public void setReferencia(String referencia) {
        this.referencia = referencia;
    }

    @Override
    public String getFoneReferencia() {
        return foneReferencia;
    }

    @Override
    public void setFoneReferencia(String foneReferencia) {
        this.foneReferencia = foneReferencia;
    }
    
    @Override
    public String getAuditoria() {
        return auditoria;
    }
    
    @Override
    public void setAuditoria(String auditoria) {
        this.auditoria = auditoria;
    }
    //</editor-fold>    
    
    //<editor-fold defaultstate="collapsed" desc="GRUD">
    @Override
    public void inserir(){
        clienteDAO.inserir();
        notificarObservers();
    }
    
    @Override
    public void atualizar(){
        clienteDAO.atualizar();
        notificarObservers();
    }
    
    @Override
    public void excluir(){
        clienteDAO.excluir();
        notificarObservers();
    }
    
    @Override
    public ArrayList pesquisar(int iOpcao, String iPesquisa) {
        return clienteDAO.pesquisar(iOpcao, iPesquisa);
    }
    //</editor-fold>    
    
    //<editor-fold defaultstate="collapsed" desc="OBSERVER">
    @Override
    public void registrarObserver(Observer o) {
        observers.add(o);
    }
    
    @Override
    public void removerObserver(Observer o) {
        int i = observers.indexOf(o);
        if (i >= 0){
            observers.remove(i);
        }
    }
    
    @Override
    public void notificarObservers() {
        for (int i = 0;i < observers.size();i++){
            Observer observer = (Observer) observers.get(i);
            observer.update();
        }
    }
    //</editor-fold> 

    
    
}
